// ffmpeg_processor.h
#ifndef FFMPEG_PROCESSOR_H
#define FFMPEG_PROCESSOR_H

#include <QVideoFrame>
#include <QMutex>
#include <memory>

extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
#include <libavutil/opt.h>
#include <libavutil/channel_layout.h>
}

class FFmpegProcessor
{
public:
    static FFmpegProcessor& instance();

    // 视频编码 (RGB32 -> H.264)
    QByteArray encodeVideo(const QVideoFrame& frame);
    // 视频解码 (H.264 -> RGB32)
    QByteArray decodeVideo(const QByteArray& packet);

    // 音频编码 (PCM -> AAC)
    QByteArray encodeAudio(const QByteArray& pcm, int samples);
    // 音频解码 (AAC -> PCM)
    QByteArray decodeAudio(const QByteArray& aac);

private:
    FFmpegProcessor();
    ~FFmpegProcessor();

    void initVideoEncoder();
    void initVideoDecoder();
    void initAudioEncoder();
    void initAudioDecoder();

    // 视频相关
    AVCodecContext* video_enc_ctx = nullptr;
    AVCodecContext* video_dec_ctx = nullptr;
    SwsContext* sws_ctx = nullptr;

    // 音频相关
    AVCodecContext* audio_enc_ctx = nullptr;
    AVCodecContext* audio_dec_ctx = nullptr;
    SwrContext* swr_ctx = nullptr;

    QMutex video_mutex;
    QMutex audio_mutex;
};

#endif // FFMPEG_PROCESSOR_H
